package br.com.supermercado.web.bean;

import java.io.Serializable;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;

import br.com.supermercado.dao.CompraDAO;
import br.com.supermercado.dao.ProdutoDAO;
import br.com.supermercado.dao.SupermercadoDAO;
import br.com.supermercado.domain.Compra;
import br.com.supermercado.domain.Produto;
import br.com.supermercado.domain.Supermercado;

@Name("compraBean")
@Scope(ScopeType.CONVERSATION)
public class CompraBean implements Serializable {

	private static final long serialVersionUID = -1139586089926788490L;

	@In(create = true)
	private SupermercadoDAO supermercadoDAO;
	
	@In(create = true)
	private ProdutoDAO produtoDAO;
	
	@In(create = true)
	private CompraDAO compraDAO; 
	
	private List<Supermercado> supermercadoList = null;
	private List<Produto> produtoList = null;

	private String nomeSupermercado = "";
	private String nomeProduto = "";
	private String ultimosPrecos = "";

	private Date data;
	private BigDecimal preco;
	
	@DataModel
	private List<Compra> compraList = new ArrayList<Compra>();
	
	@DataModelSelection
	private Compra compra;
	
	private static final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	
	public List<Supermercado> carregarSupermercados(Object obj) {
		String nome = (String) obj;
		
		List<Supermercado> out = supermercadoDAO.findByDescricao(nome);
		
		return out;
		
	}

	public List<Produto> carregarProdutos(Object obj) {
		String nome = (String) obj;
		
		List<Produto> out = produtoDAO.findByDescricao(nome);
		
		return out;
		
	}
	
	public void carregarUltimosPrecos() {
		Produto produto = produtoDAO.findByNome(nomeProduto);
		
		List<Compra> ultimasCompras = compraDAO.findUltimasCompras(5, produto);
		
		if (ultimasCompras == null || ultimasCompras.size() <= 0) {
			ultimosPrecos = "Primeira compra.";
			return;
			
		}
		
		StringBuilder sb = new StringBuilder("<b>" + produto.getDescricao() + "</b><br/>");
		for (Compra compra : ultimasCompras) {
			sb.append(sdf.format(compra.getData()));
			sb.append(" - ");
			sb.append(compra.getSupermercado().getDescricao());
			sb.append(" - <b>R$ ");
			sb.append(compra.getPreco());
			sb.append("</b><br/>");
			
		}
		
		ultimosPrecos = sb.toString();
		
	}
	
	public void create() {
		Produto produto = produtoDAO.findByNome(nomeProduto);
		
		if (produto == null) {
			produto = new Produto();
			produto.setDescricao(nomeProduto);
			produto = produtoDAO.create(produto);
			
		}
		
		Supermercado supermercado = supermercadoDAO.findByNome(nomeSupermercado);
		if (supermercado == null) {
			Supermercado novo = new Supermercado();
			novo.setDescricao(nomeSupermercado);
			supermercado = supermercadoDAO.create(novo);
			
		}
		
		Compra compra = new Compra();
		compra.setPreco(preco);
		compra.setData(data);
		compra.setProduto(produto);
		compra.setSupermercado(supermercado);
		
		compraDAO.create(compra);

		nomeProduto = "";
		preco = null;
		ultimosPrecos = "";
		compra = null;
		
	}
	
	public String pesquisar() {
		compraList = compraDAO.findByNomeProdutoAndDataCompra(nomeProduto, data);
		
		return null;
		
	}
	
	public String prepararUpdate() {
		nomeProduto = compra.getProduto().getDescricao();
		nomeSupermercado = compra.getSupermercado().getDescricao();
		
		return "update";
		
	}
	
	public String update() {
		Produto produto = produtoDAO.findByNome(nomeProduto);
		
		if (produto == null) {
			produto = new Produto();
			produto.setDescricao(nomeProduto);
			produto = produtoDAO.create(produto);
			
		}
		
		Supermercado supermercado = supermercadoDAO.findByNome(nomeSupermercado);
		
		compra.setProduto(produto);
		compra.setSupermercado(supermercado);
		
		compraDAO.update(compra);
		
		clear();
		
		return "ok";
		
	}
	
	public String delete() {
		compraDAO.delete(compra);
		
		clear();
		
		return "ok";
		
	}
	
	public void clear() {
		nomeProduto = "";
		nomeSupermercado = "";
		preco = null;
		ultimosPrecos = "";
		compra = null;
		
	}
	
	
	public String getNomeSupermercado() {
		return nomeSupermercado;
	}

	public void setNomeSupermercado(String nomeSupermercado) {
		this.nomeSupermercado = nomeSupermercado;
	}

	public String getNomeProduto() {
		return nomeProduto;
	}

	public void setNomeProduto(String nomeProduto) {
		this.nomeProduto = nomeProduto;
	}

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	public BigDecimal getPreco() {
		return preco;
	}

	public void setPreco(BigDecimal preco) {
		this.preco = preco;
	}

	public String getUltimosPrecos() {
		return ultimosPrecos;
	}

	public void setUltimosPrecos(String ultimosPrecos) {
		this.ultimosPrecos = ultimosPrecos;
	}

	public Compra getCompra() {
		return compra;
	}

	public void setCompra(Compra compra) {
		this.compra = compra;
	}


}
